 #include<bits/stdc++.h>
 using namespace std;
 #define all(x) (x).begin(),(x).end()
 #define rall(x) (x).rbegin(),(x).rend()
 const int N=2e5+10;
 #define INF 0x3f3f3f3f;
 typedef long long int ll;
 #define close(); std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
 //----------------------------------------------------------------------------//
 int n,m;
 void solve()
 {
 	cin>>n>>m;
 	int mi=min(n,m);
 	int mx=max(n,m);
 	if(n==1&&m==1) cout<<0<<'\n';
 	else if(n==1&&m==2) cout<<1<<'\n'; 
 	else if(n==2&&m==1) cout<<1<<'\n';
 	else if(n>=2&&m>=2)
 	{
 		int dict=2*(mi-1);//第一格不算
 		dict+=2*(mx-mi);//算出剩余多少行
 		if((mx-mi)&1) dict--;//奇数横向走比竖向走多1
 		cout<<dict<<'\n';
 	}
 	else cout<<-1<<'\n';//n or m 很大,另一个为一行
 	
 
 	
 }
 
 int main()
 {
 	close();
 	int T; cin>>T;
 	while (T--) solve();
 	return 0;
 }

 //(1,1)->(n,m)
 //不能在同一个方向移动两次